package com.wxsoft.java.thread.state.block;

/**
 * join —— 让一个线程等待另一个线程完成才继续执行。如A线程线程执行体中调用B线程的join()方法，则A线程被阻塞
 * ，知道B线程执行完为止，A才能得以继续执行。
 * 
 * sleep —— 让当前的正在执行的线程暂停指定的时间，并进入阻塞状态。在其睡眠的时间段内，该线程由于不是处于就绪状态
 * ，因此不会得到执行的机会。即使此时系统中没有任何其他可执行的线程 ，出于 sleep()中的线程也不会执行。因此sleep()方法常用来暂停线程执行。
 * 前面有讲到，当调用了新建的线程的start()方法后，线程进入到就绪状态，可能会在接下来的某个时间获取CPU时间片得以执行，
 * 如果希望这个新线程必然性的立即执行，直接调用原来线程的sleep(1)即可。
 * 
 * @author chenliang
 * 
 */
public class ThreadTest {

	public static void main(String[] args) {

		MyRunnable myRunnable = new MyRunnable();
		Thread thread = new Thread(myRunnable);

		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
			if (i == 30) {
				thread.start();
				try {
					thread.join(); // main线程需要等待thread线程执行完后才能继续执行

//					System.out.println("主线程睡觉！");
//					Thread.sleep(1); // 使得thread必然能够马上得以执行
//					System.out.println("主线程睡觉结束！");

				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("主线程执行完毕！");
	}
}

class MyRunnable implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}
}